package linguo.player;

import java.awt.Graphics;
import java.awt.image.BufferedImage;

import linguo.Data;
import linguo.Game;
import linguo.level.Board;

public class Bullet {

	protected Board board;
	protected int x, y;
	protected Orientacion o;
	protected BufferedImage image;
	protected int damage;
	protected Game game;
	protected Robot robot;

	public Bullet(Game game, Board board, int x, int y, Orientacion o, Robot robot) {
		this.board = board;
		this.game = game;
		game.getBulletHandler().addBullet(this);
		this.x = x;
		this.y = y;
		this.o = o;
		this.robot = robot;
		damage = 1;

		switch (o) {
			case UP :
				image = Data.SPRITE_SHEET.grabImage(0, 1);
				break;
			case DOWN :
				image = Data.SPRITE_SHEET.grabImage(1, 1);
				break;
			case LEFT :
				image = Data.SPRITE_SHEET.grabImage(2, 1);
				break;
			case RIGHT :
				image = Data.SPRITE_SHEET.grabImage(3, 1);
				break;
		}
	}

	/**
	 * Mueve la bala a traves del mapa
	 */
	public void update() {
		switch (o) {
			case UP :
				moveUP();
				break;
			case DOWN :
				moveDOWN();
				break;
			case LEFT :
				moveLEFT();
				break;
			case RIGHT :
				moveRIGHT();
				break;
		}
	}

	/**
	 * Dibuja el grafico g pasado por parametro
	 * @param g grafico a dibujar
	 */
	public void render(Graphics g) {
		g.drawImage(image, x, y, null);
	}

	/**
	 * 
	 * @return Posicion x de la bala
	 */
	public int getX() {
		return x;
	}

	/**
	 * 
	 * @return Posicion y de la bala
	 */
	public int getY() {
		return y;
	}
	
	/**
	 * Obtiene el robot que disparo la bala
	 * @return el robot que disparo la bala
	 */
	public Robot getRobot() {
		return robot;
	}

	/**
	 * Devuelve el valor del poder de la bala
	 * @return 
	 */
	public int getDamage() {
		return damage;
	}
	
	/**
	 * Destruye la bala
	 */
	public void destruir() {
		game.getBulletHandler().removeBullet(this);
	}

	/**
	 * Mueve la bala arriba, si esta afuera del mapa la elimina y si encuentra un objeto lo ataca
	 */
	private void moveUP() {
		y -= 10;
		if (y <= 0) destruir();
		else board.getCasillero(x, y).atacar(this);
	}

	/**
	 * Mueve la bala abajo, si esta afuera del mapa la elimina y si encuentra un objeto lo ataca
	 */
	private void moveDOWN() {
		y += 10;
		if (y >= game.getHEIGHT()) destruir();
		else board.getCasillero(x, y).atacar(this);
	}

	/**
	 * Mueve la bala a la izquierda, si esta afuera del mapa la elimina y si encuentra un objeto lo ataca
	 */
	private void moveLEFT() {
		x -= 10;
		if (x <= 0) destruir();
		else board.getCasillero(x, y).atacar(this);
	}

	/**
	 * Mueve la bala a la derecha, si esta afuera del mapa la elimina y si encuentra un objeto lo ataca
	 */
	private void moveRIGHT() {
		x += 10;
		if (x >= game.getWIDTH()) destruir();
		else board.getCasillero(x, y).atacar(this);
	}

}
